const logName = function(name) {
  return new Promise(function(resolve, reject) {
    setTimeout(() => {
      resolve(name);
    }, 0);
  })
}

const gen = function* () {
  const f1 = yield logName('test1');
  const f2 = yield logName('test2');
  console.log(f1.toString());
  console.log(f2.toString());
}

const g = gen();
g.next().value.then(data => {
  g.next(data).value.then(data => {
    g.next(data);
  });
});

// 第一次调用 next, gen 函数执行, 直到遇到第一个 yield 表达式为止, 它返回一个对象, 它有个 key 名叫, value 就是 logName 返回的 Promise
// 第二次调用 next, gen 函数从上次 yield 表达式停下的地方开始一直执行到下一个 yield 表达式, 其参数作为上一次 yield 的返回值
// 第三次调用 next, gen 函数执行结束, 其参数作为上一次 yield 的返回值
// yield 本身没有返回值, 或者说总返回 undefined, next 方法带一个参数, 被当做上一个 yield 的返回值

// async await 实现
// 将 generator 函数的星号替换成 async 并前置, 将 yield 替换成 await 
// 优势: 内置执行器, 更好的语义化, 返回值是 Promise
const asyncFn = async function fn() {
  const f1 = await logName('test1');
  const f2 = await logName('test2');
  console.log(f1.toString());
  console.log(f2.toString());
}

asyncFn();